package src;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class test {


    public static void main(String[] args) {
//        System.out.println("开始========================");
//
//
//        Runnable runnable = ()-> {
//            for (int i = 0; i < 100; i++) {
//                System.out.println(i);
//            }
//        };
//        new Thread(runnable).start();
//        System.out.println("--------------------------------------------------------");


//        ---------------------Lambda----------------------------
//
//        Map<String, String> map = new HashMap<>();
//        map.put("a", "a");
//        map.put("b", "b");
//        map.put("c", "c");
//        map.put("d", "d");
//
//        System.out.println("map拉姆达表达式遍历:");
//        map.forEach((k, v) -> {
//            System.out.println("k=" + k + "，v=" + v);
//        });

//
//        List<String> list = new ArrayList<>();
//        list.add("a");
//        list.add("bb");
//        list.add("ccc");
//        list.add("dddd");
//        System.out.println("list拉姆达表达式遍历:");
//        list.forEach(v -> {
//            System.out.println(v);
//        });
//        System.out.println("list双冒号运算符遍历:");
//        list.forEach(System.out::println);


//        List<String> list = Arrays.asList("张三", "李四", "王五", "xuwujing");
//        System.out.println("过滤之前:" + list);
//        List<String> result = new ArrayList<>();
//        for (String str : list) {
//            if (!"李四".equals(str)) {
//                result.add(str);
//            }
//        }
//        System.out.println("过滤之后:===" + result);
//
//        //使用Steam方式进行过滤：
//        List<String> result2 = list.stream().filter(str -> !"李四".equals(str)).collect(Collectors.toList());
//        System.out.println("stream 过滤之后:" + result2);






//        Stream stream = Stream.of("a", "b", "c");
//        String[] strArray = new String[] { "a", "b", "c" };
//        stream = Stream.of(strArray);
//        stream = Arrays.stream(strArray);
//        List<String> list = Arrays.asList(strArray);
//        stream = list.stream();

//
//        try {
//            Stream<String> stream2 = Stream.of("a", "b", "c");
//            // 转换成 Array
//            String[] strArray1 = stream2.toArray(String[]::new);
//
//            // 转换成 Collection
//            List<String> list1 = stream2.collect(Collectors.toList());
//            List<String> list2 = stream2.collect(Collectors.toCollection(ArrayList::new));
//            Set set1 = stream2.collect(Collectors.toSet());
//            Stack stack1 = stream2.collect(Collectors.toCollection(Stack::new));
//
//            // 转换成 String
//            String str = stream.collect(Collectors.joining()).toString();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }







//        集合处理
//        List<String> list3 = Arrays.asList("zhangSan", "liSi", "wangWu");
//        System.out.println("转换之前的数据:" + list3);
//        List<String> list4 = list3.stream().map(String::toUpperCase).collect(Collectors.toList());
//        System.out.println("转换之后的数据:" + list4);
//
//        List<String> list31 = Arrays.asList("1", "2", "3");
//        System.out.println("转换之前的数据:" + list31);
//        List<Integer> list41 = list31.stream().map(Integer::valueOf).collect(Collectors.toList());
//        System.out.println("转换之后的数据:" + list41);
//
//        List<Integer> list5 = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
//        List<Integer> list6 = list5.stream().map(n -> n * n).collect(Collectors.toList());
//        System.out.println("平方的数据:" + list6);

        //过滤
//        List<String> list = Arrays.asList("张三", "李四", "王五", "xuwujing");
//        String result3 = list.stream().filter(str -> "李四".equals(str)).findAny().orElse("找不到!");
//        String result4 = list.stream().filter(str -> "李二".equals(str)).findAny().orElse("找不到!");
//        System.out.println("stream 过滤之后 2:" + result3);
//        System.out.println("stream 过滤之后 3:" + result4);


//         计算这个list中出现 "张三" id的值
//        List<User> lists = new ArrayList<User>();
//        lists.add(new User(6, "张三"));
//        lists.add(new User(2, "李四"));
//        lists.add(new User(3, "王五"));
//        lists.add(new User(1, "张三"));
//        int sum = lists.stream().filter(u -> "张三".equals(u.getName())).mapToInt(u -> u.getId()).sum();
//
//        System.out.println("计算结果:" + sum);


//        String worlds = "The way of the future";
//        List<String> list7 = new ArrayList<>();
//        list7.add(worlds);
//        List<String> list8 = list7.stream().flatMap(str -> Stream.of(str.split(" ")))
//                .filter(world -> world.length() > 0).collect(Collectors.toList());
//        System.out.println("单词:");
//        list8.forEach(System.out::println);


//        Random rd = new Random();
//        System.out.println("取到的前三条数据:");
//        rd.ints().limit(3).forEach(System.out::println);
//
//        Random rd2 = new Random();
//        System.out.println("取到的前三条数据然后进行排序:");
//        rd2.ints().limit(3).sorted().forEach(System.out::println);

//        List<String> strings = Arrays.asList("a", "", "c", "", "e","", " ");
//        // 获取空字符串的数量
//        long count =  strings.parallelStream().filter(string -> string.isEmpty()).count();
//        System.out.println("空字符串的个数:"+count);

        //过滤重复
//        String lines = "good good study day day up";
//        List<String> list14 = new ArrayList<>();
//        list14.add(lines);
//        List<String> words = list14.stream().flatMap(line -> Stream.of(line.split(" "))).filter(word -> word.length() > 0)
//                .map(String::toLowerCase).distinct().sorted().collect(Collectors.toList());
//        System.out.println("去重复之后:" + words);
        //拼接
//        String concat = Stream.of("A", "B", "C", "D").reduce("", String::concat);
//        System.out.println("字符串拼接:" + concat);
//
//        double minValue = Stream.of(-4.0, 1.0, 3.0, -2.0).reduce(Double.MAX_VALUE, Double::min);
//        System.out.println("最小值:" + minValue);
//        //最小值:-4.0
//
//
//        //示例三：求和
//        // 求和, 无起始值
//        int sumValue = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();
//        System.out.println("有无起始值求和:" + sumValue);
//        // 求和, 有起始值
//        sumValue = Stream.of(1, 2, 3, 4).reduce(1, Integer::sum);
//        System.out.println("有起始值求和:" + sumValue);
//        // 有无起始值求和:10
//        // 有起始值求和:11
//
//
//        //示例四：过滤拼接
//        concat = Stream.of("a", "B", "c", "D", "e", "F").filter(x -> x.compareTo("Z") > 0).reduce("", String::concat);
//        System.out.println("过滤和字符串连接:" + concat);


//        System.out.println("通过年龄进行分区排序:");
//        Map<Boolean, List<User>> children = Stream.generate(new UserSupplier3()).limit(5)
//                .collect(Collectors.partitioningBy(p -> p.getId() < 18));
//
//        System.out.println("小孩: " + children.get(true));
//        System.out.println("成年人: " + children.get(false));

        //聚合计算
//        List<Integer> numbers = Arrays.asList(1, 5, 7, 3, 9);
//        IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
//
//        System.out.println("列表中最大的数 : " + stats.getMax());
//        System.out.println("列表中最小的数 : " + stats.getMin());
//        System.out.println("所有数之和 : " + stats.getSum());
//        System.out.println("平均数 : " + stats.getAverage());

        //本地日期,不包括时分秒
        LocalDate nowDate = LocalDate.now();
        //本地日期,包括时分秒
        LocalDateTime ldt = LocalDateTime.now();
//        System.out.println("当前时间:"+nowDate);
//        System.out.println("当前时间:"+ldt);
//        System.out.println("当前年:"+ldt.getYear());
//        System.out.println("当前年份天数:"+ldt.getDayOfYear());
//        System.out.println("当前时:"+ldt.getHour());
//        System.out.println("当前分:"+ldt.getMinute());
//        System.out.println("当前时间:"+ldt.toString());
//        System.out.println("格式化时间: "+ ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
//        System.out.println("后5天时间:"+ldt.plusDays(5));
//        System.out.println("前5天时间并格式化:"+ldt.minusDays(5).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
//        System.out.println("前一个月的时间:"+ldt.minusMonths(1).format(DateTimeFormatter.ofPattern("yyyyMM")));
//        System.out.println("后一个月的时间:"+ldt.plusMonths(1));
//        System.out.println("指定2099年的当前时间:"+ldt.withYear(2099));

        LocalDate ld=LocalDate.parse("2017-11-17");
        LocalDate ld2=LocalDate.parse("2018-01-05");
        Period p=Period.between(ld, ld2);
        System.out.println("相差年: "+p.getYears()+" 相差月 :"+p.getMonths() +" 相差天:"+p.getDays());

        LocalDateTime ldt4 = LocalDateTime.now();
        LocalDateTime ldt5 = ldt4.plusMinutes(10);
        System.out.println("当前时间是否大于:"+ldt4.isAfter(ldt5));
        System.out.println("当前时间是否小于"+ldt4.isBefore(ldt5));
    }
}
